//! Сцена
class Scene {

friend class System;

protected:

	//! Сцена для обработки
	static Scene* _active_scene;
	
public:

	//! Событие реакции на сообщение
	virtual void on_message(const Message& msg);

	//! Вернет указатель на текущую активную сцену
	static const Scene* active_scene();

};

const Scene* Scene::active_scene(){
	return _active_scene;
}

void Scene::on_message(const Message& msg){}

Scene* Scene::_active_scene = 0;

//! Simple Scene 
class SimpleScene:public Scene{
public:

	//! Обработка сообщения
	virtual void on_message(const Message& msg){
		switch (msg.type){
		case GE_MESSAGE_REDRAW:
			on_draw();
			break;
		case GE_MESSAGE_ON_FRAME:
			on_frame();
			break;
		case GE_MESSAGE_RESIZE:
			on_resize(msg.value.as_int[0],msg.value.as_int[1]);
			break;
		case GE_MESSAGE_INIT:
			on_init();
			break;
		case GE_MESSAGE_PAUSE:
			on_pause();
			break;
		case GE_MESSAGE_CONTINUE:
			on_continue();
			break;
		case GE_MESSAGE_CLOSE:
			on_close();
			break;
		case GE_MESSAGE_CHAR:
			on_char(msg.value.as_int[0],msg.value.as_int[1]);
			break;
		case GE_MESSAGE_KEY:
			on_key(msg.value.as_int[0],msg.value.as_int[1]);
			break;
		case GE_MESSAGE_MOUSE_MOVE:
			on_mouse_move(msg.value.as_int[0],msg.value.as_int[1]);
			break;
		case GE_MESSAGE_MOUSE_BUTTON:
			on_mouse_button(msg.value.as_int[0],msg.value.as_int[1]);
			break;
		case GE_MESSAGE_MOUSE_WHEEL:
			on_mouse_wheel(msg.value.as_int[0]);
			break;
		}
	}

	//! Инициализация
	virtual void on_init();
	
	//! Закрытие сцены
	virtual void on_close();
	
	//! Пауза сцены
	virtual void on_pause();
	
	//! Возобновление сцены
	virtual void on_continue();
	
	//! Перед прорисовкой кадра, 
	//* после обработки событий но события сгенерированные эвентом будут обработанны перед сценой
	virtual void on_frame();
	
	//! Рисует сцену
	virtual void on_draw();
	
	//! Изменение размера окна
	virtual void on_resize(int width, int height);
	
	//! Движение мышью
	virtual void on_mouse_move(int x, int y);
	
	//! Нажатие кнопки мыши
	virtual void on_mouse_button(int button, bool action);
	
	//! Колесо мыши
	virtual void on_mouse_wheel(bool action);
	
	//! Улавиатура
	virtual void on_key(int key,bool action);
	
	//! Печать текста
	virtual void on_char(wchar_t ch, bool action);

};

void SimpleScene::on_init(){
}

void SimpleScene::on_close(){
}

void SimpleScene::on_pause(){
}

void SimpleScene::on_continue(){
}

void SimpleScene::on_frame(){
}

void SimpleScene::on_draw(){
}

void SimpleScene::on_resize(int width, int height){
}

void SimpleScene::on_mouse_move(int x, int y){
}

void SimpleScene::on_mouse_button(int button, bool action){
}

void SimpleScene::on_mouse_wheel(bool action){
}

void SimpleScene::on_key(int key,bool action){
}

void SimpleScene::on_char(wchar_t ch, bool action){
}